package com.hancher.gamelife2.function;

import android.annotation.SuppressLint;
import android.os.Bundle;

import androidx.navigation.Navigation;

import com.hancher.common.androidutil.AsyncUtils;
import com.hancher.common.androidutil.LogUtil;
import com.hancher.common.base.BaseMvpFragment;
import com.hancher.common.javautil.EmptyUtil;
import com.hancher.common.javautil.GsonUtil;
import com.hancher.common.javautil.Md5Util;
import com.hancher.common.rv.PageRecyclerViewManager;
import com.hancher.gamelife2.R;
import com.hancher.gamelife2.databinding.FragmentFunctionBinding;
import com.hancher.gamelife2.main.MainDatabase_Impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import io.reactivex.rxjava3.functions.Consumer;

/**
 * 作者 : Hancher ytu_shaoweijie@163.com <br/>
 * 时间 : 2023/3/12 0012 22:49 <br/>
 * 描述 :
 */
public class FunctionFragment extends BaseMvpFragment<FragmentFunctionBinding, FunctionPresenter> {


    private PageRecyclerViewManager<FunctionAdapter.FunctionItem> prvm;

    @SuppressLint("DefaultLocale")
    @Override
    protected void initView(Bundle savedInstanceState) {
        LogUtil.d("当前Fragment" + this);

        prvm = new PageRecyclerViewManager<FunctionAdapter.FunctionItem>()
                .setContext(getActivity())
                .setAdapter(new FunctionAdapter((firstPosition, secondPosition) -> {
//                    ToastUtil.show(String.format("点击 %d - %d", firstPosition, secondPosition));
                    LogUtil.d(String.format("点击 %d - %d", firstPosition, secondPosition));
                    Function2Adapter.Function2Item item = prvm.getRvList().get(firstPosition).getData().get(secondPosition);
                    AsyncUtils.run(emitter -> {
                        // 查找数据库
                        FunctionPO functionPO = MainDatabase_Impl.getInstance().functionDao().getItemByMd5(item.getMd5());
                        // 更新数据库
                        functionPO.setClickCount(functionPO.getClickCount() + 1);
                        functionPO.setUpdateTime(System.currentTimeMillis());
                        MainDatabase_Impl.getInstance().functionDao().updateItem(functionPO);
                        emitter.onNext("");
                        emitter.onComplete();
                    }, o -> Navigation.findNavController(binding.container).navigate(item.getAction()));

                }))
                .setRecyclerView(binding.recyclerview)
                .setRefreshLayout(binding.refreshLayout)
                .setEnableRefresh(false)
                .setEnableLoadMore(false)
                .setEnableEmptyView(false)
                .init()
        ;
    }

    @Override
    protected void initListener() {
    }


    @Override
    protected void initData() {
        AsyncUtils.run(emitter -> {
            LogUtil.d("数据库 组装数据");
            List<FunctionPO> allData = new ArrayList<>();

            // region 动态更新此处实例即可
            allData.add(new FunctionPO());
            allData.get(allData.size() - 1).setCategory("记录");
            allData.get(allData.size() - 1).setTitle("事项");
            allData.get(allData.size() - 1).setTag("MatterFragment");
            allData.get(allData.size() - 1).setAction(R.id.action_mainFragment_to_matterFragment);
            allData.get(allData.size() - 1).setDrawable(R.drawable.icon_matter);
            allData.get(allData.size() - 1).setClickCount(0L);
            allData.get(allData.size() - 1).setMd5(Md5Util.getStrMd5(allData.get(allData.size() - 1).getCategory() + "-" + allData.get(allData.size() - 1).getTitle()));
            allData.get(allData.size() - 1).setUuid(allData.get(allData.size() - 1).getMd5());
            // endregion

            // region 动态更新此处实例即可
            allData.add(new FunctionPO());
            allData.get(allData.size() - 1).setCategory("记录");
            allData.get(allData.size() - 1).setTitle("日记");
            allData.get(allData.size() - 1).setTag("DiaryListFragment");
            allData.get(allData.size() - 1).setAction(R.id.action_mainFragment_to_diaryListFragment);
            allData.get(allData.size() - 1).setDrawable(R.drawable.icon_note);
            allData.get(allData.size() - 1).setClickCount(0L);
            allData.get(allData.size() - 1).setMd5(Md5Util.getStrMd5(allData.get(allData.size() - 1).getCategory() + "-" + allData.get(allData.size() - 1).getTitle()));
            allData.get(allData.size() - 1).setUuid(allData.get(allData.size() - 1).getMd5());
            // endregion


            // region 动态更新此处实例即可
            allData.add(new FunctionPO());
            allData.get(allData.size() - 1).setCategory("记录");
            allData.get(allData.size() - 1).setTitle("生日");
            allData.get(allData.size() - 1).setTag("BirthdayListFragment");
            allData.get(allData.size() - 1).setAction(R.id.action_mainFragment_to_birthdayListFragment);
            allData.get(allData.size() - 1).setDrawable(R.drawable.icon_birthday);
            allData.get(allData.size() - 1).setClickCount(0L);
            allData.get(allData.size() - 1).setMd5(Md5Util.getStrMd5(allData.get(allData.size() - 1).getCategory() + "-" + allData.get(allData.size() - 1).getTitle()));
            allData.get(allData.size() - 1).setUuid(allData.get(allData.size() - 1).getMd5());
            // endregion

            // region 动态更新此处实例即可
            allData.add(new FunctionPO());
            allData.get(allData.size() - 1).setCategory("记录");
            allData.get(allData.size() - 1).setTitle("账户");
            allData.get(allData.size() - 1).setTag("AccountListFragment");
            allData.get(allData.size() - 1).setAction(R.id.action_mainFragment_to_accountListFragment);
            allData.get(allData.size() - 1).setDrawable(R.drawable.icon_account);
            allData.get(allData.size() - 1).setClickCount(0L);
            allData.get(allData.size() - 1).setMd5(Md5Util.getStrMd5(allData.get(allData.size() - 1).getCategory() + "-" + allData.get(allData.size() - 1).getTitle()));
            allData.get(allData.size() - 1).setUuid(allData.get(allData.size() - 1).getMd5());
            // endregion

            // region 动态更新此处实例即可
            allData.add(new FunctionPO());
            allData.get(allData.size() - 1).setCategory("记录");
            allData.get(allData.size() - 1).setTitle("打卡");
            allData.get(allData.size() - 1).setTag("ColockInMainFragment");
            allData.get(allData.size() - 1).setAction(R.id.action_mainFragment_to_colockInMainFragment);
            allData.get(allData.size() - 1).setDrawable(R.drawable.icon_colockin);
            allData.get(allData.size() - 1).setClickCount(0L);
            allData.get(allData.size() - 1).setMd5(Md5Util.getStrMd5(allData.get(allData.size() - 1).getCategory() + "-" + allData.get(allData.size() - 1).getTitle()));
            allData.get(allData.size() - 1).setUuid(allData.get(allData.size() - 1).getMd5());
            // endregion


            // region 动态更新此处实例即可
            allData.add(new FunctionPO());
            allData.get(allData.size() - 1).setCategory("记录");
            allData.get(allData.size() - 1).setTitle("月经");
            allData.get(allData.size() - 1).setTag("MenstrualListFragment");
            allData.get(allData.size() - 1).setAction(R.id.action_mainFragment_to_menstrualListFragment);
            allData.get(allData.size() - 1).setDrawable(R.drawable.icon_menstrual);
            allData.get(allData.size() - 1).setClickCount(0L);
            allData.get(allData.size() - 1).setMd5(Md5Util.getStrMd5(allData.get(allData.size() - 1).getCategory() + "-" + allData.get(allData.size() - 1).getTitle()));
            allData.get(allData.size() - 1).setUuid(allData.get(allData.size() - 1).getMd5());
            // endregion

            // region 动态更新此处实例即可
            allData.add(new FunctionPO());
            allData.get(allData.size() - 1).setCategory("功能");
            allData.get(allData.size() - 1).setTitle("备份");
            allData.get(allData.size() - 1).setTag("BackupSqliteFragment");
            allData.get(allData.size() - 1).setAction(R.id.action_mainFragment_to_backupFragment);
            allData.get(allData.size() - 1).setDrawable(R.drawable.icon_backup);
            allData.get(allData.size() - 1).setClickCount(0L);
            allData.get(allData.size() - 1).setMd5(Md5Util.getStrMd5(allData.get(allData.size() - 1).getCategory() + "-" + allData.get(allData.size() - 1).getTitle()));
            allData.get(allData.size() - 1).setUuid(allData.get(allData.size() - 1).getMd5());
            // endregion


            // region 动态更新此处实例即可
            allData.add(new FunctionPO());
            allData.get(allData.size() - 1).setCategory("功能");
            allData.get(allData.size() - 1).setTitle("扫码");
            allData.get(allData.size() - 1).setTag("ScanFragment");
            allData.get(allData.size() - 1).setAction(R.id.action_mainFragment_to_scanFragment);
            allData.get(allData.size() - 1).setDrawable(R.drawable.icon_scan);
            allData.get(allData.size() - 1).setClickCount(0L);
            allData.get(allData.size() - 1).setMd5(Md5Util.getStrMd5(allData.get(allData.size() - 1).getCategory() + "-" + allData.get(allData.size() - 1).getTitle()));
            allData.get(allData.size() - 1).setUuid(allData.get(allData.size() - 1).getMd5());
            // endregion


            // region 动态更新此处实例即可
            allData.add(new FunctionPO());
            allData.get(allData.size() - 1).setCategory("功能");
            allData.get(allData.size() - 1).setTitle("加密解密");
            allData.get(allData.size() - 1).setTag("ScanFragment");
            allData.get(allData.size() - 1).setAction(R.id.action_mainFragment_to_encryptFragment);
            allData.get(allData.size() - 1).setDrawable(R.drawable.icon_encrypt);
            allData.get(allData.size() - 1).setClickCount(0L);
            allData.get(allData.size() - 1).setMd5(Md5Util.getStrMd5(allData.get(allData.size() - 1).getCategory() + "-" + allData.get(allData.size() - 1).getTitle()));
            allData.get(allData.size() - 1).setUuid(allData.get(allData.size() - 1).getMd5());
            // endregion


            // region 动态更新此处实例即可
            allData.add(new FunctionPO());
            allData.get(allData.size() - 1).setCategory("功能");
            allData.get(allData.size() - 1).setTitle("噪音检测");
            allData.get(allData.size() - 1).setTag("NoiseDetectFragment");
            allData.get(allData.size() - 1).setAction(R.id.action_mainFragment_to_noiseDetectFragment);
            allData.get(allData.size() - 1).setDrawable(R.drawable.icon_noise);
            allData.get(allData.size() - 1).setClickCount(0L);
            allData.get(allData.size() - 1).setMd5(Md5Util.getStrMd5(allData.get(allData.size() - 1).getCategory() + "-" + allData.get(allData.size() - 1).getTitle()));
            allData.get(allData.size() - 1).setUuid(allData.get(allData.size() - 1).getMd5());
            // endregion


            // region 动态更新此处实例即可
            allData.add(new FunctionPO());
            allData.get(allData.size() - 1).setCategory("功能");
            allData.get(allData.size() - 1).setTitle("频率检测");
            allData.get(allData.size() - 1).setTag("FrequencyDetectFragment");
            allData.get(allData.size() - 1).setAction(R.id.action_mainFragment_to_frequencyDetectFragment);
            allData.get(allData.size() - 1).setDrawable(R.drawable.icon_frequency);
            allData.get(allData.size() - 1).setClickCount(0L);
            allData.get(allData.size() - 1).setMd5(Md5Util.getStrMd5(allData.get(allData.size() - 1).getCategory() + "-" + allData.get(allData.size() - 1).getTitle()));
            allData.get(allData.size() - 1).setUuid(allData.get(allData.size() - 1).getMd5());
            // endregion


            // region 动态更新此处实例即可
            allData.add(new FunctionPO());
            allData.get(allData.size() - 1).setCategory("功能");
            allData.get(allData.size() - 1).setTitle("视频截取");
            allData.get(allData.size() - 1).setTag("VideoCaptureFragment");
            allData.get(allData.size() - 1).setAction(R.id.action_mainFragment_to_videoCaptureFragment);
            allData.get(allData.size() - 1).setDrawable(R.drawable.icon_capture);
            allData.get(allData.size() - 1).setClickCount(0L);
            allData.get(allData.size() - 1).setMd5(Md5Util.getStrMd5(allData.get(allData.size() - 1).getCategory() + "-" + allData.get(allData.size() - 1).getTitle()));
            allData.get(allData.size() - 1).setUuid(allData.get(allData.size() - 1).getMd5());
            // endregion


            // region 动态更新此处实例即可
            allData.add(new FunctionPO());
            allData.get(allData.size() - 1).setCategory("功能");
            allData.get(allData.size() - 1).setTitle("图片拼接");
            allData.get(allData.size() - 1).setTag("PictureCombineFragment");
            allData.get(allData.size() - 1).setAction(R.id.action_mainFragment_to_pictureCombineFragment);
            allData.get(allData.size() - 1).setDrawable(R.drawable.icon_combine);
            allData.get(allData.size() - 1).setClickCount(0L);
            allData.get(allData.size() - 1).setMd5(Md5Util.getStrMd5(allData.get(allData.size() - 1).getCategory() + "-" + allData.get(allData.size() - 1).getTitle()));
            allData.get(allData.size() - 1).setUuid(allData.get(allData.size() - 1).getMd5());
            // endregion


            // region 动态更新此处实例即可
            allData.add(new FunctionPO());
            allData.get(allData.size() - 1).setCategory("功能");
            allData.get(allData.size() - 1).setTitle("指南针");
            allData.get(allData.size() - 1).setTag("CompassFragment");
            allData.get(allData.size() - 1).setAction(R.id.action_mainFragment_to_compassFragment);
            allData.get(allData.size() - 1).setDrawable(R.drawable.icon_compress);
            allData.get(allData.size() - 1).setClickCount(0L);
            allData.get(allData.size() - 1).setMd5(Md5Util.getStrMd5(allData.get(allData.size() - 1).getCategory() + "-" + allData.get(allData.size() - 1).getTitle()));
            allData.get(allData.size() - 1).setUuid(allData.get(allData.size() - 1).getMd5());
            // endregion

            // region 动态更新此处实例即可
            allData.add(new FunctionPO());
            allData.get(allData.size() - 1).setCategory("游戏");
            allData.get(allData.size() - 1).setTitle("扫雷");
            allData.get(allData.size() - 1).setTag("SaoLeiFragment");
            allData.get(allData.size() - 1).setAction(R.id.action_mainFragment_to_saoLeiFragment);
            allData.get(allData.size() - 1).setDrawable(R.drawable.icon_saolei);
            allData.get(allData.size() - 1).setClickCount(0L);
            allData.get(allData.size() - 1).setMd5(Md5Util.getStrMd5(allData.get(allData.size() - 1).getCategory() + "-" + allData.get(allData.size() - 1).getTitle()));
            allData.get(allData.size() - 1).setUuid(allData.get(allData.size() - 1).getMd5());
            // endregion

            LogUtil.d("数据库 插入不存在的条目");
            MainDatabase_Impl.getInstance().functionDao().insertList(allData);

            LogUtil.d("数据库 更新点击、最近标识");
            List<FunctionPO> dbData = MainDatabase_Impl.getInstance().functionDao().getAll();
            if (EmptyUtil.isNotEmpty(dbData)) {
                FunctionPO maxClick = dbData.get(0);
                FunctionPO last = dbData.get(0);
                for (FunctionPO dbItem : dbData) {
                    if (dbItem.getClickCount() > maxClick.getClickCount()) {
                        maxClick = dbItem;
                    }
                    if (dbItem.getUpdateTime() > last.getUpdateTime()) {
                        last = dbItem;
                    }
                }
                for (FunctionPO item : allData) {
                    if (item.getMd5().equals(maxClick.getMd5())) {
                        item.setClickSort(1);
                    }
                    if (item.getMd5().equals(last.getMd5())) {
                        item.setRecentSort(1);
                    }
                }
            }

            emitter.onNext(allData);
            emitter.onComplete();
        }, (Consumer<List<FunctionPO>>) o -> {
            //字典 分类-列表
            HashMap<String, List<FunctionPO>> categoryMap = new HashMap<>();
            for (FunctionPO item : o) {
                List<FunctionPO> list = categoryMap.get(item.getCategory());
                if (list == null) {
                    list = new ArrayList<>();
                    categoryMap.put(item.getCategory(), list);
                }
                list.add(item);
            }

            //字典转列表
            List<FunctionAdapter.FunctionItem> list = new ArrayList<>();
            for (Map.Entry<String, List<FunctionPO>> mapEntry : categoryMap.entrySet()) {
                FunctionAdapter.FunctionItem functionItem1 = new FunctionAdapter.FunctionItem();
                functionItem1.setTitle(mapEntry.getKey());
                List<Function2Adapter.Function2Item> subList1 = new ArrayList<>();
                for (FunctionPO item : mapEntry.getValue()) {
                    //直接复制字段
                    Function2Adapter.Function2Item item11 = GsonUtil.copy(item, Function2Adapter.Function2Item.class);
                    subList1.add(item11);
                }
                functionItem1.setData(subList1);
                list.add(functionItem1);
            }
            prvm.freshData(list);
        });

    }

    public void oldList() {

        FunctionPO clickMaxItem = MainDatabase_Impl.getInstance().functionDao().getClickMaxItem();
        FunctionPO recentItem = MainDatabase_Impl.getInstance().functionDao().getRecentItem();


        List<FunctionAdapter.FunctionItem> list = new ArrayList<>();

        FunctionAdapter.FunctionItem functionItem1 = new FunctionAdapter.FunctionItem();
        functionItem1.setTitle("记录");
        List<Function2Adapter.Function2Item> subList1 = new ArrayList<>();
        //region 事项
        Function2Adapter.Function2Item item11 = new Function2Adapter.Function2Item();
        item11.setTitle("事项");
        item11.setTag("MatterFragment");
        item11.setClickSort(isSameItem(item11, clickMaxItem));
        item11.setRecentSort(isSameItem(item11, recentItem));
        item11.setAction(R.id.action_mainFragment_to_matterFragment);
        item11.setDrawable(R.drawable.icon_matter);
        subList1.add(item11);
        //endregion
        Function2Adapter.Function2Item item12 = new Function2Adapter.Function2Item();
        item12.setTitle("item12");
        item12.setDrawable(R.drawable.icon_scan);
        item12.setClickSort(1);
        subList1.add(item12);
        functionItem1.setData(subList1);
        list.add(functionItem1);

        FunctionAdapter.FunctionItem functionItem2 = new FunctionAdapter.FunctionItem();
        functionItem2.setTitle("homeItem2");
        List<Function2Adapter.Function2Item> subList2 = new ArrayList<>();
        Function2Adapter.Function2Item item21 = new Function2Adapter.Function2Item();
        item21.setTitle("item21");
        item21.setRecentSort(1);
        item21.setDrawable(R.drawable.icon_scan);
        subList2.add(item21);
        functionItem2.setData(subList2);
        list.add(functionItem2);

        prvm.freshData(list);
    }

    private int isSameItem(Function2Adapter.Function2Item item11, FunctionPO recentItem) {
        if (item11 == null || recentItem == null) {
            return 0;
        }
        if (EmptyUtil.haveEmpty(item11.getTag(), recentItem.getTag())) {
            return 0;
        }
        return item11.getTag().equals(recentItem.getTag()) ? 1 : 0;
    }
}